Aula 2 - Introdução à Econometria

Autor

João Ricardo F. de Lima

Data de Publicação

30 de maio de 2024

Modelos de Regressão Simples

Definição do Modelo de Regressão Simples

O modelo de regressão simples pode ser usado para estudar a relação entre duas variáveis. Em outras palavras, quando se pretender analisar como “y” varia quando “x” mudar;

Considere duas variáveis “y” e “x” que representam alguma população. A equação abaixo relaciona as duas variáveis:

\[ y=\beta_0+\beta_1x+u \]

A equação acima é válida para a população de interesse e chamada de modelo de regressão linear simples. Pode ser também chamada de regressão bivariada ou de duas variáveis.

Quando relacionadas como acima, as variáveis x e y* podem ser denominadas de diversas formas:

Tabela 1: Terminologia para a regressão simples:
Y X
Variável Dependente Variável Independente
Variável Explicada Variável Explicativa
Variável de Resposta Variável de Controle
Variável Prevista Variável Previsora
Regressando Regressor

O termo covariável também pode ser usado para x. O mais comum é variável dependente e independente.

Se os outros fatores são fixos, sua variação é zero, ou seja, \(\Delta u=0\). Assim, x tem um efeito linear sobre y:

\[ \Delta y=\beta_1 \Delta x \quad se \quad \Delta u=0 \]

A variação em y é, simplesmente, \(\beta_1\) multiplicado pela variação em x. Isso significa que \(\beta_1\) é o parâmetro de inclinação da relação entre y e x, mantendo fixos os fatores em u;

O parâmetro de intercepto \(\beta_0\) é chamado de constante do modelo.

O coeficiente de inclinação mede a taxa (parcial) da mudança no valor médio de y para uma mudança de uma unidade no valor da variável independente, tudo o mais constante;

O termo de erro u representa todas aquelas variáveis que não podem estar explícitas no modelo por razões diversas. Contudo, se assume que a influência destas sobre o regressando é insignificante;

Pode-se entender o termo de erro como os fatores não observados que afetam y.

Hipóteses do Modelo Clássico de Regressão Linear

Em relação ao termo de erro, é necessário fazer uma hipótese que restrinja a relação dele com a variável independente (x);

Como u e x são variáveis aleatórias, pode-se definir a distribuição condicional de u dado qualquer valor de x. A hipótese para se estimar um modelo de regressão com betas confiáveis é

\[ E(u|x)=E(u)=0 \]

O que está indicado na equação acima é que o valor médio de u é o mesmo para qualquer valor de x e igual a sua média aritmética. Em outras palavras, diz que u é independente da média de x.

Considerando o valor esperado da equação de Y em função de X e usando \(E(u|x)=0\), se obtém:

\[ E(y|x)=\beta_0+\beta_1x \]

A equação dada acima mostra que a função de regressão populacional (FRP), \(E(y|x)\), é uma função linear de x;

A linearidade significa que o aumento de uma unidade em x faz com que o valor esperado de y varie segundo a magnitude de \(\beta_1\);

Para qualquer valor dado de x, a distribuição de y está centrada ao redor de \(E(y|x)\).

Modelo Clássico de Regressão Linear

Fonte: WOOLDRIDGE, 2017

Derivação das estimativas de Mínimos Quadrados Ordinários (MQO)

Para estimar o Modelo de Regressão Linear, ou seja, encontrar os parâmetros \(\beta_0\) e \(\beta_1\) da primeira equação acima o método mais usado é o dos Mínimos Quadrados Ordinários (MQO), pois é intuitivamente e matematicamente mais simples;

Dado que um Modelo de Regressão:

\[ Y=\widehat{\beta}_0+\widehat{\beta}_1X+\widehat{u} \]

pode ser definido também como:

\[ \widehat{Y}=\widehat{\beta}_0+\widehat{\beta}_1X \]

em que o “chápeu” sobre Y, os betas e u enfatiza que os valores são estimativas.

Pode-se reescrever de forma que:

\[ Y=\widehat{Y}+\widehat{u} \]

ou ainda:

\[ \widehat{u}=Y-\widehat{Y} \]

então, um método bom para se obter as estimativas dos \(\beta\)s seria fazer com que a soma de todos os erros fosse a menor possível;

Modelo Clássico de Regressão Linear

Fonte: WOOLDRIDGE, 2017

Por questões teóricas, o método dos Mínimos Quadrados Ordinários (MQO) minimiza a soma dos erros ao quadrado, dando peso diferente às observações cujo valor estimado esteja mais próximo ou mais distante do valor observado (\(Y\));

Assim, o que se precisa é minimizar uma função conhecida como Soma de Quadrados dos Resíduos (SQR):

\[ min \sum\widehat{u}^2=\sum(Y-\widehat{\beta}_0-\widehat{\beta}_1X)^2 \]

\[ \frac{\partial\sum u^2}{\partial \beta_0}=2\sum(Y-\hat{\beta_0}-\hat{\beta_1}X)(-1)=-2\sum(Y-\hat{\beta_0}-\hat{\beta_1}X) \]

\[ \frac{\partial\sum u^2}{\partial \beta_1}=2\sum(Y-\hat{\beta_0}-\hat{\beta_1}X)(-X)=-2\sum(Y-\hat{\beta_0}-\hat{\beta_1}X)(X) \]

Igualando as derivadas a zero, tem-se

\[ -2\sum(Y-\hat{\beta_0}-\hat{\beta_1}X)=0 \]

\[ -2\sum(Y-\hat{\beta_0}-\hat{\beta_1}X)(X)=0 \]

Se dividir tudo por -2N, tem-se

\[ \frac{\sum(Y-\hat{\beta_0}-\hat{\beta_1}X)}{N}=0 \]

\[ \frac{\sum(Y-\hat{\beta_0}-\hat{\beta_1}X)(X)}{N}=0 \]

Usando o operador do somatório tem-se:

\[ \overline{Y}=\hat{\beta_0}+\hat{\beta_1}\overline{X} \]

\[ \hat{\beta_0}=\overline{Y}-\hat{\beta_1}\overline{X} \]

Uma vez que se tenha \(\hat{\beta_1}\), dados os valores das médias de Y e X se obtém o valor de \(\hat{\beta_0}\).

Considerando a outra equação, mas suprimindo o N, que não afeta a solução, se pode obter:

\[ \sum(Y-(\overline{Y}-\hat{\beta_1}\overline{X})-\hat{\beta_1}X)(X)=0 \]

\[ \sum(X)(Y-\overline{Y})=\sum(X)(-\hat{\beta_1}\overline{X})+\hat{\beta_1}X=0 \]

Como \(\hat{\beta_1}\) é uma constante e colocando em evidência:

\[ \sum(X)(Y-\overline{Y})=\hat{\beta_1}\sum(X)(X-\overline{X}) \]

Das propriedades do somatório, se tem que:

\[ \sum(X)(Y-\overline{Y})=\sum(X-\overline{X})(Y-\overline{Y}) \]

\[ \sum(X)(X-\overline{X})=\sum(X-\overline{X})^2 \]

Então, desde que \(\sum(X-\overline{X})^2>0\), a inclinação estimada é

\[ \hat{\beta_1}=\frac{\sum(X-\overline{X})(Y-\overline{Y})}{\sum(X-\overline{X})^2} \]

\[ \hat{\beta_1}=\frac{\sum xy}{\sum x^2} \]

com \(x=X-\overline{X}\) e \(y=Y-\overline{Y}\).

A equação dada em acima é a covariância amostral de x e y dividida pela variância amostral de x. Podemos reescrever a forma de encontrar o \(\hat{\beta}_1\) como abaixo:

\[ \hat{\beta_1}=\frac{cov(xy)}{\hat{\sigma}_x \hat{\sigma}_x}\frac{\hat{\sigma}_y}{\hat{\sigma}_y} \]

\[ \hat{\beta_1}=\frac{cov(xy)}{\hat{\sigma}_x \hat{\sigma}_y}\frac{\hat{\sigma}_y}{\hat{\sigma}_x} \]

\[ \hat{\beta_1}=\hat{\rho}_{xy}\frac{\hat{\sigma}_y}{\hat{\sigma}_x} \]

Em que \(\hat{\rho}_{xy}\) é a correlação amostral entre x e y; e \(\hat{\sigma}_y\) e \(\hat{\sigma}_x\) são os desvios padrões amostrais. Se a correlação de x e y for positiva, \(\hat\beta_1>0\) e se for negativa, \(\hat\beta_1<0\).

Uma vez determinados os estimadores de intercepto e inclinação de MQO (Mínimos Quadrados Ordinários), se constrói a reta de regressão de MQO:

\[ \hat{y}=\hat{\beta}_{0}+\hat{\beta}_{1}x \]

A função dada em acima é chamada de função de regressão amostral (FRA), pois ela é uma versão estimada da função de regressão populacional \(E(y|x)=\beta_{0}+\beta_1x\).

Como a FRA é obtida para determinada amostra de dados, uma amostra diferente irá gerar um intercepto e um coeficiente de inclinação diferentes.

Exemplo da Regressão Simples

Com os dados de CEOSAL1, estimar a regressão entre salario anual em milhares de dólares (salary) de diretores executivos e retorno médio sobre o patrimônio líquido (roe), que é dado como uma % do patrimônio líquido.

Exemplo no R

Diretório e Carregamento dos pacotes

#Verificando o diretorio que o R está direcionado
#getwd()

#Direcionado o R para o Diretorio a ser trabalhado
#setwd('/Users/jricardofl/Dropbox/tempecon/Facape/econometria1')

#Limpa o Ambiente Global
rm(list=ls())

#Pode usar dados de outros softwares
library(wooldridge)
library(ggplot2)
library(dplyr)
library(rstatix)

Entrada dos dados

#Carregar dados no computador
ceolsal1 <- data('ceosal1')

#Observar a estrutura dos dados
glimpse(ceosal1)
Rows: 209
Columns: 12
$ salary   <int> 1095, 1001, 1122, 578, 1368, 1145, 1078, 1094, 1237, 833, 567…
$ pcsalary <int> 20, 32, 9, -9, 7, 5, 10, 7, 16, 5, 7, -3, -9, 9, 49, 4, 12, 9…
$ sales    <dbl> 27595.0, 9958.0, 6125.9, 16246.0, 21783.2, 6021.4, 2266.7, 29…
$ roe      <dbl> 14.1, 10.9, 23.5, 5.9, 13.8, 20.0, 16.4, 16.3, 10.5, 26.3, 25…
$ pcroe    <dbl> 106.4, -30.6, -16.3, -25.7, -3.0, 1.0, -5.9, -1.6, -70.2, -23…
$ ros      <int> 191, 13, 14, -21, 56, 55, 62, 44, 37, 37, 109, -10, 41, 44, 6…
$ indus    <int> 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1…
$ finance  <int> 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0…
$ consprod <int> 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0…
$ utility  <int> 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0…
$ lsalary  <dbl> 6.998509, 6.908755, 7.022868, 6.359574, 7.221105, 7.043160, 6…
$ lsales   <dbl> 10.225389, 9.206132, 8.720281, 9.695602, 9.988894, 8.703075, …
tail(ceolsal1)
[1] "ceosal1"

Estatística Descritiva

A primeira análise é sobre as estatísticas descritivas das duas variáveis.

attach(ceosal1)
#Estatistica Descritiva dos Dados
summary(salary)
   Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
    223     736    1039    1281    1407   14822 
summary(roe)
   Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
   0.50   12.40   15.50   17.18   20.00   56.30 
# Gráfico de Dispersão dos dados

plot(salary ~ roe,
     data = ceosal1,
     main = "Gráfico de Dispersão de Salário e ROE",
     ylab = "Salário",
     xlab = "ROE")

cor(salary, roe)
[1] 0.1148417

Estimação do Modelo

A tarefa que enfrentamos agora é encontrar uma linha que melhor se ajuste aos dados. É claro que seria possível simplesmente ficar com a inspeção gráfica e a análise de correlação e, em seguida, selecionar a melhor linha de ajuste observando.

No entanto, isso seria bastante subjetivo: diferentes observadores traçariam diferentes linhas de regressão. Por conta disso, estamos interessados em técnicas menos arbitrárias. Tal técnica é dada pela estimativa de mínimos quadrados ordinários (MQO).

Em seguida, a análise de regressão simples com o cálculo dos betas de diversas formas:

#Estimar a regressao com intercepto

# computa beta_1_chapéu
beta_1 <- sum((roe - mean(roe)) * (salary - mean(salary))) / sum((roe - mean(roe))^2)

# computa beta_0_chapéu
beta_0 <- mean(salary) - beta_1 * mean(roe)

# mostra os resultados no Console
beta_1
[1] 18.50119
beta_0
[1] 963.1913
# Outra forma
regressao1 <- lm(salary ~ roe, data=ceosal1)

#Resultados da Regressao
summary(regressao1)

Call:
lm(formula = salary ~ roe, data = ceosal1)

Residuals:
    Min      1Q  Median      3Q     Max 
-1160.2  -526.0  -254.0   138.8 13499.9 

Coefficients:
            Estimate Std. Error t value Pr(>|t|)    
(Intercept)   963.19     213.24   4.517 1.05e-05 ***
roe            18.50      11.12   1.663   0.0978 .  
---
Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

Residual standard error: 1367 on 207 degrees of freedom
Multiple R-squared:  0.01319,   Adjusted R-squared:  0.008421 
F-statistic: 2.767 on 1 and 207 DF,  p-value: 0.09777

Gráfico do Modelo Estimado

g1 <- ggplot(data = ceosal1, aes(x = roe, y = salary)) +
  geom_point() +
  stat_smooth(method = "lm", col = "dodgerblue3") +
  theme(panel.background = element_rect(fill = "white"),
        axis.line.x=element_line(),
        axis.line.y=element_line()) +
  ggtitle("Modelo Linear Estimado")

g1

Fazer previsão com base no modelo estimado

Com base no modelo estimado é possível fazer previsões. Se \(roe=30\), quanto seria o salário estimado?

predict(regressao1, data.frame(roe = 30))
       1 
1518.227 

Exemplo no Python

import wooldridge
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns
import statsmodels.formula.api as smf

#Carregar dados no computador
ceosal1 = wooldridge.data('ceosal1')

#Observar a estrutura dos dados
wooldridge.data('ceosal1', description=True)
name of dataset: ceosal1
no of variables: 12
no of observations: 209

+----------+-------------------------------+
| variable | label                         |
+----------+-------------------------------+
| salary   | 1990 salary, thousands $      |
| pcsalary | % change salary, 89-90        |
| sales    | 1990 firm sales, millions $   |
| roe      | return on equity, 88-90 avg   |
| pcroe    | % change roe, 88-90           |
| ros      | return on firm's stock, 88-90 |
| indus    | =1 if industrial firm         |
| finance  | =1 if financial firm          |
| consprod | =1 if consumer product firm   |
| utility  | =1 if transport. or utilties  |
| lsalary  | natural log of salary         |
| lsales   | natural log of sales          |
+----------+-------------------------------+

I took a random sample of data reported in the May 6, 1991 issue of
Businessweek.
# Estatística descritiva

ceosal1["salary"].describe()
count      209.000000
mean      1281.119617
std       1372.345308
min        223.000000
25%        736.000000
50%       1039.000000
75%       1407.000000
max      14822.000000
Name: salary, dtype: float64
ceosal1["roe"].describe()
count    209.000000
mean      17.184211
std        8.518509
min        0.500000
25%       12.400000
50%       15.500000
75%       20.000000
max       56.299999
Name: roe, dtype: float64
# Gráfico

# plot
plt.subplots()
#plt.scatter(ceosal1["roe"], ceosal1["salary"], data=ceosal1)
plt.scatter('roe', 'salary', data = ceosal1, c = "black")
plt.xlabel('ROE')
plt.ylabel('Salário')
plt.title('Gráfico de Dispersão de Salário e ROE')
plt.box(False)
plt.show()

# Correlação

ceosal1["salary"].corr(ceosal1["roe"], method='pearson')
0.11484173492695986
# Regressão Linear Simples

reg1 = smf.ols('salary ~ roe', data = ceosal1)

#Resultado da Regressão
reg1.fit().summary()
OLS Regression Results
Dep. Variable: salary R-squared: 0.013
Model: OLS Adj. R-squared: 0.008
Method: Least Squares F-statistic: 2.767
Date: Qui, 30 Mai 2024 Prob (F-statistic): 0.0978
Time: 19:44:49 Log-Likelihood: -1804.5
No. Observations: 209 AIC: 3613.
Df Residuals: 207 BIC: 3620.
Df Model: 1
Covariance Type: nonrobust
coef std err t P>|t| [0.025 0.975]
Intercept 963.1913 213.240 4.517 0.000 542.790 1383.592
roe 18.5012 11.123 1.663 0.098 -3.428 40.431
Omnibus: 311.096 Durbin-Watson: 2.105
Prob(Omnibus): 0.000 Jarque-Bera (JB): 31120.902
Skew: 6.915 Prob(JB): 0.00
Kurtosis: 61.158 Cond. No. 43.3


Notes:
[1] Standard Errors assume that the covariance matrix of the errors is correctly specified.
reg1.fit().params
Intercept    963.191336
roe           18.501186
dtype: float64
# Outra Opção de Output de Resultado

result = reg1.fit()
print(result.summary())
                            OLS Regression Results                            
==============================================================================
Dep. Variable:                 salary   R-squared:                       0.013
Model:                            OLS   Adj. R-squared:                  0.008
Method:                 Least Squares   F-statistic:                     2.767
Date:                Qui, 30 Mai 2024   Prob (F-statistic):             0.0978
Time:                        19:44:49   Log-Likelihood:                -1804.5
No. Observations:                 209   AIC:                             3613.
Df Residuals:                     207   BIC:                             3620.
Df Model:                           1                                         
Covariance Type:            nonrobust                                         
==============================================================================
                 coef    std err          t      P>|t|      [0.025      0.975]
------------------------------------------------------------------------------
Intercept    963.1913    213.240      4.517      0.000     542.790    1383.592
roe           18.5012     11.123      1.663      0.098      -3.428      40.431
==============================================================================
Omnibus:                      311.096   Durbin-Watson:                   2.105
Prob(Omnibus):                  0.000   Jarque-Bera (JB):            31120.902
Skew:                           6.915   Prob(JB):                         0.00
Kurtosis:                      61.158   Cond. No.                         43.3
==============================================================================

Notes:
[1] Standard Errors assume that the covariance matrix of the errors is correctly specified.
print("Parameters: ", result.params)
Parameters:  Intercept    963.191336
roe           18.501186
dtype: float64
print(result.params[0])
963.1913364725581
print(result.params[1])
18.50118634521493
y_hat = result.fittedvalues
u_hat = result.resid
print(y_hat)
0      1224.058071
1      1164.854261
2      1397.969216
3      1072.348338
4      1218.507712
          ...     
204    1129.702014
205    1249.959725
206    1187.055698
207    1216.657586
208    1229.608413
Length: 209, dtype: float64
print(u_hat)
0     -129.058071
1     -163.854261
2     -275.969216
3     -494.348338
4      149.492288
          ...    
204   -199.702014
205   -724.959725
206   -529.055698
207   -661.657586
208   -603.608413
Length: 209, dtype: float64
# Gráfico da regressão
sns.set_theme()

plt.figure(figsize = (20,8))

sns.regplot(x = 'roe', y = 'salary', data = ceosal1).set(title='Modelo Linear Estimado')

# Fazer Previsão com o modelo estimado

nova_obs = pd.DataFrame({"roe": [30]})
result.predict(nova_obs)
0    1518.226927
dtype: float64